Programming CDISC ADaM ADNCA using R and {admiral}

Jeff Dickinson, Navitas Data Sciences

Agenda

  • Basic Concepts of Non-Compartmental Analysis NCA
  • Quick overview of {admiral}
  • Coding Steps for ADNCA
  • New Functionality Highlights
  • Conclusions
  • Questions and Answers

CDISC Standards for Non-Compartmental Analysis

https://www.cdisc.org/standards/foundational/adam/adamig-non-compartmental-analysis-input-data-v1-0

Non-Compartmental Analysis (NCA)

Example PK Curve with Parameters

Important Components of ADNCA datasets

  • Inclusion of Both PK Concentration records PC and Dosing Records EX
  • Timing Variables for Nominal and Actual Time
  • Duplicated Records for Analysis
  • Exclusion Flags

Note: I will be using terms ADNCA and ADPC interchangeably

Time Variables

Variable Variable Label
NFRLT Nom. Rel. Time from Analyte First Dose
AFRLT Act. Rel. Time from Analyte First Dose
NRRLT Nominal Rel. Time from Ref. Dose
ARRLT Actual Rel. Time from Ref. Dose
MRRLT Modified Rel. Time from Ref. Dose

Note: a relative time variable may refer to previous dose or next dose

Duplicated Records for Analysis

  • Use One Record in More than One Way
  • Record may be both “24 Hour Post-Dose” and “Pre-Dose”
  • Or “Cycle 2 Day 1 Pre-Dose” and “Cycle 1 Day 28 Post-Dose”
  • Relative Times for “Pre-Dose” will be Negative
  • Create DTYPE = “COPY” Records
  • Original PCSEQ is Retained

Brief Overview of {admiral}

https://github.com/pharmaverse/admiral

{admiral}

  • ADaM in R Asset Library

  • {admiral} is Open Source and Collaborative

  • {admiral} is Modular

  • {admiral} is Part of Pharmaverse

{admiral} is Open Source and Collaborative

{admiral} Ecosystem

{admiral} is Modular

  • Not One Large Function (e.g. create_adpc())

  • Multiple Coordinated Functions

{admiral} is Part of Pharmaverse

https://github.com/pharmaverse

{admiral} updates for PK

(March 6, 2023 release 0.10.0)

  • New ad_adpc.R Template

  • New PK Programming Vignette

  • Updates to create_single_dose_dataset() function

Programming Workflow

  • Read in Data

  • Expand Dosing Records

  • Find First Dose and Calculate First Datetime

  • Find Reference Dose Dates Corresponding to PK Records

  • Combine PC and EX Records and Derive Relative Time Variables

  • Derive Analysis Variables

Programming Workflow (Continued)

  • Create Duplicated Records for Analysis

  • Combine ADPC data with Duplicated Records

  • Calculate Baseline and Change from Baseline

  • Assign ASEQ

  • Add Additional Baseline Variables

  • Add ADSL variables

  • Add Labels and Attributes

{admiral} Libraries

library(admiral)
library(admiraldev)
library(admiral.test)
library(dplyr)
library(lubridate)
library(stringr)

Read in Data

data("admiral_adsl")
data("admiral_ex")
data("admiral_pc")
data("admiral_vs")

adsl <- admiral_adsl
ex <- convert_blanks_to_na(admiral_ex)
pc <- convert_blanks_to_na(admiral_pc)
vs <- convert_blanks_to_na(admiral_vs)

PC Rawdata

# A tibble: 14 × 6
   USUBJID     PCTEST     PCDTC               VISIT    PCTPT            PCSTRESN
   <chr>       <chr>      <chr>               <chr>    <chr>               <dbl>
 1 01-701-1028 XANOMELINE 2013-07-18T23:30:00 BASELINE Pre-dose           0     
 2 01-701-1028 XANOMELINE 2013-07-19T00:05:00 BASELINE 5 Min Post-dose    0.0957
 3 01-701-1028 XANOMELINE 2013-07-19T00:30:00 BASELINE 30 Min Post-dose   0.522 
 4 01-701-1028 XANOMELINE 2013-07-19T01:00:00 BASELINE 1h Post-dose       0.895 
 5 01-701-1028 XANOMELINE 2013-07-19T01:30:00 BASELINE 1.5h Post-dose     1.16  
 6 01-701-1028 XANOMELINE 2013-07-19T02:00:00 BASELINE 2h Post-dose       1.35  
 7 01-701-1028 XANOMELINE 2013-07-19T04:00:00 BASELINE 4h Post-dose       1.71  
 8 01-701-1028 XANOMELINE 2013-07-19T06:00:00 BASELINE 6h Post-dose       1.80  
 9 01-701-1028 XANOMELINE 2013-07-19T08:00:00 BASELINE 8h Post-dose       1.82  
10 01-701-1028 XANOMELINE 2013-07-19T12:00:00 BASELINE 12h Post-dose      0.571 
11 01-701-1028 XANOMELINE 2013-07-19T16:00:00 BASELINE 16h Post-dose      0.178 
12 01-701-1028 XANOMELINE 2013-07-20T00:00:00 BASELINE 24h Post-dose      0.0173
13 01-701-1028 XANOMELINE 2013-07-20T12:00:00 BASELINE 36h Post-dose     NA     
14 01-701-1028 XANOMELINE 2013-07-21T00:00:00 BASELINE 48h Post-dose     NA     

This CDISC test PC data has concentrations over 48 hours from a daily patch

Join ADSL with PC

  • Use function derive_vars_merged()
  • Convert Dates to Numeric
  • Functions
    • derive_vars_dtm()

    • derive_vars_dtm_to_dt()

    • derive_vars_dtm_to_tm()

    • derive_vars_dy()

  • Derive NFRLT for PC data based on PCTPTNUM

PC Merge Code

adsl_vars <- exprs(TRTSDT, TRTSDTM, TRT01P, TRT01A)

adpc <- pc %>%
  # Join ADSL with PC (need TRTSDT for ADY derivation)
  derive_vars_merged(
    dataset_add = adsl,
    new_vars = adsl_vars,
    by_vars = exprs(STUDYID, USUBJID)
  ) %>%
  # Calculate ADTM, ADT, ADY
  derive_vars_dtm(
    new_vars_prefix = "A",
    dtc = PCDTC,
    time_imputation = "00:00:00"
  ) %>%
  # Derive dates and times from date/times
  derive_vars_dtm_to_dt(exprs(ADTM)) %>%
  derive_vars_dtm_to_tm(exprs(ADTM)) %>%
  derive_vars_dy(reference_date = TRTSDT, source_vars = exprs(ADT)) %>%
  # Derive event ID and nominal relative time from first dose (NFRLT)
  mutate(
    EVID = 0,
    DRUG = PCTEST,
    NFRLT = if_else(PCTPTNUM < 0, 0, PCTPTNUM), .after = USUBJID
  )

PC Merge Code Output

# A tibble: 14 × 6
   USUBJID     PCTEST     ADTM                VISIT    PCTPT            NFRLT
   <chr>       <chr>      <dttm>              <chr>    <chr>            <dbl>
 1 01-701-1028 XANOMELINE 2013-07-18 23:30:00 BASELINE Pre-dose          0   
 2 01-701-1028 XANOMELINE 2013-07-19 00:05:00 BASELINE 5 Min Post-dose   0.08
 3 01-701-1028 XANOMELINE 2013-07-19 00:30:00 BASELINE 30 Min Post-dose  0.5 
 4 01-701-1028 XANOMELINE 2013-07-19 01:00:00 BASELINE 1h Post-dose      1   
 5 01-701-1028 XANOMELINE 2013-07-19 01:30:00 BASELINE 1.5h Post-dose    1.5 
 6 01-701-1028 XANOMELINE 2013-07-19 02:00:00 BASELINE 2h Post-dose      2   
 7 01-701-1028 XANOMELINE 2013-07-19 04:00:00 BASELINE 4h Post-dose      4   
 8 01-701-1028 XANOMELINE 2013-07-19 06:00:00 BASELINE 6h Post-dose      6   
 9 01-701-1028 XANOMELINE 2013-07-19 08:00:00 BASELINE 8h Post-dose      8   
10 01-701-1028 XANOMELINE 2013-07-19 12:00:00 BASELINE 12h Post-dose    12   
11 01-701-1028 XANOMELINE 2013-07-19 16:00:00 BASELINE 16h Post-dose    16   
12 01-701-1028 XANOMELINE 2013-07-20 00:00:00 BASELINE 24h Post-dose    24   
13 01-701-1028 XANOMELINE 2013-07-20 12:00:00 BASELINE 36h Post-dose    36   
14 01-701-1028 XANOMELINE 2013-07-21 00:00:00 BASELINE 48h Post-dose    48   

Note numeric datetimes and Nominal Relative Time from Analyte First Dose (NFRLT)

EX Rawdata

# A tibble: 3 × 7
  USUBJID     EXTRT      EXDOSFRQ EXSTDTC    EXENDTC    VISIT    VISITDY
  <chr>       <chr>      <chr>    <chr>      <chr>      <chr>      <dbl>
1 01-701-1028 XANOMELINE QD       2013-07-19 2013-08-01 BASELINE       1
2 01-701-1028 XANOMELINE QD       2013-08-02 2014-01-06 WEEK 2        14
3 01-701-1028 XANOMELINE QD       2014-01-07 2014-01-14 WEEK 24      168

This CDISC test exposure data is for a daily patch

Merge ADSL with EX

  • Use Function derive_vars_merged()
  • Keep Only Non-Zero Dose
  • Convert Dates to Numeric
  • Impute missing times to 0:00*
  • Functions
    • derive_vars_dtm()

    • derive_vars_dtm_to_dt()

  • Derive NFRLT based on VISITDY

EX Merge Code

# ---- Get dosing information ----

ex <- ex %>%
  derive_vars_merged(
    dataset_add = adsl,
    new_vars = adsl_vars,
    by_vars = exprs(STUDYID, USUBJID)
  ) %>%
  # Keep records with nonzero dose
  filter(EXDOSE > 0) %>%
  # Add time and set missing end date to start date
  # Impute missing time to 00:00:00
  # Derive Analysis Start and End Dates
  derive_vars_dtm(
    new_vars_prefix = "AST",
    dtc = EXSTDTC,
    time_imputation = "00:00:00"
  ) %>%
  derive_vars_dtm(
    new_vars_prefix = "AEN",
    dtc = EXENDTC,
    time_imputation = "00:00:00"
  ) %>%
  # Derive event ID and nominal relative time from first dose (NFRLT)
  mutate(
    EVID = 1,
    NFRLT = 24 * (VISITDY - 1), .after = USUBJID
  ) %>%
  # Set missing end dates to start date
  mutate(AENDTM = case_when(
    is.na(AENDTM) ~ ASTDTM,
    TRUE ~ AENDTM
  )) %>%
  # Derive dates from date/times
  derive_vars_dtm_to_dt(exprs(ASTDTM)) %>%
  derive_vars_dtm_to_dt(exprs(AENDTM))

EX Merge Output

# A tibble: 3 × 7
  USUBJID     EXTRT      EXDOSFRQ ASTDT      AENDT      VISITDY NFRLT
  <chr>       <chr>      <chr>    <date>     <date>       <dbl> <dbl>
1 01-701-1028 XANOMELINE QD       2013-07-19 2013-08-01       1     0
2 01-701-1028 XANOMELINE QD       2013-08-02 2014-01-06      14   312
3 01-701-1028 XANOMELINE QD       2014-01-07 2014-01-14     168  4008

Note numeric dates and Nominal Relative Time from Analyte First Dose (NFRLT)

Expand Dosing Records

  • Need to add records between start date and end date
  • Use function create_single_dose_dataset()
  • Need to also expand nominal relative time NFRLT
  • For example EXDOSFRQ = “QD” will expand NFRLT by 24 hours
  • New feature of function

Expansion Example Code

# ---- Expand dosing records between start and end dates ----

ex_exp <- ex %>%
  create_single_dose_dataset(
    dose_freq = EXDOSFRQ,
    start_date = ASTDT,
    start_datetime = ASTDTM,
    end_date = AENDT,
    end_datetime = AENDTM,
    nominal_time = NFRLT,
    lookup_table = dose_freq_lookup,
    lookup_column = CDISC_VALUE,
    keep_source_vars = exprs(
      STUDYID, USUBJID, EVID, EXDOSFRQ, EXDOSFRM,
      NFRLT, EXDOSE, EXDOSU, EXTRT, ASTDT, ASTDTM, AENDT, AENDTM,
      VISIT, VISITNUM, VISITDY,
      TRT01A, TRT01P, DOMAIN, EXSEQ, !!!adsl_vars
    )
  ) %>%
  # Derive AVISIT based on nominal relative time
  mutate(
    AVISITN = NFRLT %/% 24 + 1,
    AVISIT = paste("Day", AVISITN),
    ADTM = ASTDTM,
    DRUG = EXTRT,
  ) %>%
  # Derive dates and times from datetimes
  derive_vars_dtm_to_dt(exprs(ADTM)) %>%
  derive_vars_dtm_to_tm(exprs(ADTM)) %>%
  derive_vars_dtm_to_tm(exprs(ASTDTM)) %>%
  derive_vars_dtm_to_tm(exprs(AENDTM)) %>%
  derive_vars_dy(reference_date = TRTSDT, source_vars = exprs(ADT))

Expansion Code Output

# A tibble: 20 × 6
   USUBJID     DRUG       EXDOSFRQ ASTDT      AVISIT NFRLT
   <chr>       <chr>      <chr>    <date>     <chr>  <dbl>
 1 01-701-1028 XANOMELINE ONCE     2013-07-19 Day 1      0
 2 01-701-1028 XANOMELINE ONCE     2013-07-20 Day 2     24
 3 01-701-1028 XANOMELINE ONCE     2013-07-21 Day 3     48
 4 01-701-1028 XANOMELINE ONCE     2013-07-22 Day 4     72
 5 01-701-1028 XANOMELINE ONCE     2013-07-23 Day 5     96
 6 01-701-1028 XANOMELINE ONCE     2013-07-24 Day 6    120
 7 01-701-1028 XANOMELINE ONCE     2013-07-25 Day 7    144
 8 01-701-1028 XANOMELINE ONCE     2013-07-26 Day 8    168
 9 01-701-1028 XANOMELINE ONCE     2013-07-27 Day 9    192
10 01-701-1028 XANOMELINE ONCE     2013-07-28 Day 10   216
11 01-701-1028 XANOMELINE ONCE     2013-07-29 Day 11   240
12 01-701-1028 XANOMELINE ONCE     2013-07-30 Day 12   264
13 01-701-1028 XANOMELINE ONCE     2013-07-31 Day 13   288
14 01-701-1028 XANOMELINE ONCE     2013-08-01 Day 14   312
15 01-701-1028 XANOMELINE ONCE     2013-08-02 Day 14   312
16 01-701-1028 XANOMELINE ONCE     2013-08-03 Day 15   336
17 01-701-1028 XANOMELINE ONCE     2013-08-04 Day 16   360
18 01-701-1028 XANOMELINE ONCE     2013-08-05 Day 17   384
19 01-701-1028 XANOMELINE ONCE     2013-08-06 Day 18   408
20 01-701-1028 XANOMELINE ONCE     2013-08-07 Day 19   432

Note: NFRLT is expanded by 24 hours for each record AVISIT has values “Day 1”, “Day 2”, “Day 3”, etc.

Find First Dose and Calculate FANLDTM

  • Use Function derive_vars_merged()
  • Parameter new_vars used to derive FANLDTM
  • Recalculate AVISIT and AVISITN based on NFRLT for this study

FANLDTM = First Datetime of Dose for Analyte

First Dose Code

# ---- Find first dose per treatment per subject ----
# ---- Join with ADPC data and keep only subjects with dosing ----

adpc <- adpc %>%
  derive_vars_merged(
    dataset_add = ex_exp,
    filter_add = (EXDOSE > 0 & !is.na(ADTM)),
    new_vars = exprs(FANLDTM = ADTM),
    order = exprs(ADTM, EXSEQ),
    mode = "first",
    by_vars = exprs(STUDYID, USUBJID, DRUG)
  ) %>%
  filter(!is.na(FANLDTM)) %>%
  # Derive AVISIT from nominal relative time
  mutate(
    AVISITN = NFRLT %/% 24 + 1,
    AVISIT = paste("Day", AVISITN),
  )

First Dose Output

# A tibble: 14 × 5
   USUBJID     FANLDTM             AVISIT ADTM                PCTPT           
   <chr>       <dttm>              <chr>  <dttm>              <chr>           
 1 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-18 23:30:00 Pre-dose        
 2 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 00:05:00 5 Min Post-dose 
 3 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 00:30:00 30 Min Post-dose
 4 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 01:00:00 1h Post-dose    
 5 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 01:30:00 1.5h Post-dose  
 6 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 02:00:00 2h Post-dose    
 7 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 04:00:00 4h Post-dose    
 8 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 06:00:00 6h Post-dose    
 9 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 08:00:00 8h Post-dose    
10 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 12:00:00 12h Post-dose   
11 01-701-1028 2013-07-19 00:00:00 Day 1  2013-07-19 16:00:00 16h Post-dose   
12 01-701-1028 2013-07-19 00:00:00 Day 2  2013-07-20 00:00:00 24h Post-dose   
13 01-701-1028 2013-07-19 00:00:00 Day 2  2013-07-20 12:00:00 36h Post-dose   
14 01-701-1028 2013-07-19 00:00:00 Day 3  2013-07-21 00:00:00 48h Post-dose   

FANLDTM = First Datetime of Dose for Analyte

Find Reference Dose Dates Corresponding to PK Records

  • Use Function derive_vars_joined()
  • Parameter filter_join used to set condition

Find Reference Dose Dates Code

# ---- Find previous dose  ----
# Use derive_vars_joined() for consistency with other variables
# This is equivalent to derive_vars_last_dose() in this case

adpc <- adpc %>%
  derive_vars_joined(
    dataset_add = ex_exp,
    by_vars = exprs(USUBJID),
    order = exprs(ADTM),
    new_vars = exprs(
      ADTM_prev = ADTM, EXDOSE_prev = EXDOSE, AVISIT_prev = AVISIT,
      AENDTM_prev = AENDTM
    ),
    join_vars = exprs(ADTM),
    filter_add = NULL,
    filter_join = ADTM > ADTM.join,
    mode = "last",
    check_type = "none"
  )

Find Reference Dose Dates Output

# A tibble: 14 × 6
   USUBJID     VISIT    ADTM                PCTPT    ADTM_prev           AVISI…¹
   <chr>       <chr>    <dttm>              <chr>    <dttm>              <chr>  
 1 01-701-1028 BASELINE 2013-07-18 23:30:00 Pre-dose NA                  <NA>   
 2 01-701-1028 BASELINE 2013-07-19 00:05:00 5 Min P… 2013-07-19 00:00:00 Day 1  
 3 01-701-1028 BASELINE 2013-07-19 00:30:00 30 Min … 2013-07-19 00:00:00 Day 1  
 4 01-701-1028 BASELINE 2013-07-19 01:00:00 1h Post… 2013-07-19 00:00:00 Day 1  
 5 01-701-1028 BASELINE 2013-07-19 01:30:00 1.5h Po… 2013-07-19 00:00:00 Day 1  
 6 01-701-1028 BASELINE 2013-07-19 02:00:00 2h Post… 2013-07-19 00:00:00 Day 1  
 7 01-701-1028 BASELINE 2013-07-19 04:00:00 4h Post… 2013-07-19 00:00:00 Day 1  
 8 01-701-1028 BASELINE 2013-07-19 06:00:00 6h Post… 2013-07-19 00:00:00 Day 1  
 9 01-701-1028 BASELINE 2013-07-19 08:00:00 8h Post… 2013-07-19 00:00:00 Day 1  
10 01-701-1028 BASELINE 2013-07-19 12:00:00 12h Pos… 2013-07-19 00:00:00 Day 1  
11 01-701-1028 BASELINE 2013-07-19 16:00:00 16h Pos… 2013-07-19 00:00:00 Day 1  
12 01-701-1028 BASELINE 2013-07-20 00:00:00 24h Pos… 2013-07-19 00:00:00 Day 1  
13 01-701-1028 BASELINE 2013-07-20 12:00:00 36h Pos… 2013-07-20 00:00:00 Day 2  
14 01-701-1028 BASELINE 2013-07-21 00:00:00 48h Pos… 2013-07-20 00:00:00 Day 2  
# … with abbreviated variable name ¹​AVISIT_prev

ADTM_prev is the datetime of the previous dose AVISIT_prev is the analysis visit of the previous dose

Find Next Dose

# ---- Find next dose  ----

adpc <- adpc %>%
  derive_vars_joined(
    dataset_add = ex_exp,
    by_vars = exprs(USUBJID),
    order = exprs(ADTM),
    new_vars = exprs(
      ADTM_next = ADTM, EXDOSE_next = EXDOSE, AVISIT_next = AVISIT,
      AENDTM_next = AENDTM
    ),
    join_vars = exprs(ADTM),
    filter_add = NULL,
    filter_join = ADTM <= ADTM.join,
    mode = "first",
    check_type = "none"
  )

Find Next Dose Output

# A tibble: 14 × 6
   USUBJID     VISIT    ADTM                PCTPT    ADTM_next           AVISI…¹
   <chr>       <chr>    <dttm>              <chr>    <dttm>              <chr>  
 1 01-701-1028 BASELINE 2013-07-18 23:30:00 Pre-dose 2013-07-19 00:00:00 Day 1  
 2 01-701-1028 BASELINE 2013-07-19 00:05:00 5 Min P… 2013-07-20 00:00:00 Day 2  
 3 01-701-1028 BASELINE 2013-07-19 00:30:00 30 Min … 2013-07-20 00:00:00 Day 2  
 4 01-701-1028 BASELINE 2013-07-19 01:00:00 1h Post… 2013-07-20 00:00:00 Day 2  
 5 01-701-1028 BASELINE 2013-07-19 01:30:00 1.5h Po… 2013-07-20 00:00:00 Day 2  
 6 01-701-1028 BASELINE 2013-07-19 02:00:00 2h Post… 2013-07-20 00:00:00 Day 2  
 7 01-701-1028 BASELINE 2013-07-19 04:00:00 4h Post… 2013-07-20 00:00:00 Day 2  
 8 01-701-1028 BASELINE 2013-07-19 06:00:00 6h Post… 2013-07-20 00:00:00 Day 2  
 9 01-701-1028 BASELINE 2013-07-19 08:00:00 8h Post… 2013-07-20 00:00:00 Day 2  
10 01-701-1028 BASELINE 2013-07-19 12:00:00 12h Pos… 2013-07-20 00:00:00 Day 2  
11 01-701-1028 BASELINE 2013-07-19 16:00:00 16h Pos… 2013-07-20 00:00:00 Day 2  
12 01-701-1028 BASELINE 2013-07-20 00:00:00 24h Pos… 2013-07-20 00:00:00 Day 2  
13 01-701-1028 BASELINE 2013-07-20 12:00:00 36h Pos… 2013-07-21 00:00:00 Day 3  
14 01-701-1028 BASELINE 2013-07-21 00:00:00 48h Pos… 2013-07-21 00:00:00 Day 3  
# … with abbreviated variable name ¹​AVISIT_next

ADTM_next is the datetime of the next dose

Find Previous Nominal Dose

# ---- Find previous nominal time ----

adpc <- adpc %>%
  derive_vars_joined(
    dataset_add = ex_exp,
    by_vars = exprs(USUBJID),
    order = exprs(NFRLT),
    new_vars = exprs(NFRLT_prev = NFRLT),
    join_vars = exprs(NFRLT),
    filter_add = NULL,
    filter_join = NFRLT > NFRLT.join,
    mode = "last",
    check_type = "none"
  )

Find Next Nominal Dose

# ---- Find next nominal time ----

adpc <- adpc %>%
  derive_vars_joined(
    dataset_add = ex_exp,
    by_vars = exprs(USUBJID),
    order = exprs(NFRLT),
    new_vars = exprs(NFRLT_next = NFRLT),
    join_vars = exprs(NFRLT),
    filter_add = NULL,
    filter_join = NFRLT <= NFRLT.join,
    mode = "first",
    check_type = "none"
  )

Find Next Nominal Dose Output

# A tibble: 14 × 5
   USUBJID     NFRLT PCTPT            NFRLT_prev NFRLT_next
   <chr>       <dbl> <chr>                 <dbl>      <dbl>
 1 01-701-1028  0    Pre-dose                 NA          0
 2 01-701-1028  0.08 5 Min Post-dose           0         24
 3 01-701-1028  0.5  30 Min Post-dose          0         24
 4 01-701-1028  1    1h Post-dose              0         24
 5 01-701-1028  1.5  1.5h Post-dose            0         24
 6 01-701-1028  2    2h Post-dose              0         24
 7 01-701-1028  4    4h Post-dose              0         24
 8 01-701-1028  6    6h Post-dose              0         24
 9 01-701-1028  8    8h Post-dose              0         24
10 01-701-1028 12    12h Post-dose             0         24
11 01-701-1028 16    16h Post-dose             0         24
12 01-701-1028 24    24h Post-dose             0         24
13 01-701-1028 36    36h Post-dose            24         48
14 01-701-1028 48    48h Post-dose            24         48

NFRLT_prev is the nominal relative time from the previous dose NFRLT_next is the nominal relative time for the next dose

Combine PC and EX Records and Derive Relative Time Variables

  • Include both dosing and concentration records
  • Use function derive_vars_duration()
  • Create Actual Relative Time AFRLT

Combine PC and EX Records and Derive Relative Time Variables Code

# ---- Combine ADPC and EX data ----
# Derive Relative Time Variables


adpc <- bind_rows(adpc, ex_exp) %>%
  group_by(USUBJID, DRUG) %>%
  mutate(
    FANLDTM = min(FANLDTM, na.rm = TRUE),
    min_NFRLT = min(NFRLT_prev, na.rm = TRUE),
    maxdate = max(ADT[EVID == 0], na.rm = TRUE), .after = USUBJID
  ) %>%
  arrange(USUBJID, ADTM) %>%
  ungroup() %>%
  filter(ADT <= maxdate) %>%
  # Derive Actual Relative Time from First Dose (AFRLT)
  derive_vars_duration(
    new_var = AFRLT,
    start_date = FANLDTM,
    end_date = ADTM,
    out_unit = "hours",
    floor_in = FALSE,
    add_one = FALSE
  ) %>%
  # Derive Actual Relative Time from Reference Dose (ARRLT)
  derive_vars_duration(
    new_var = ARRLT,
    start_date = ADTM_prev,
    end_date = ADTM,
    out_unit = "hours",
    floor_in = FALSE,
    add_one = FALSE
  ) %>%
  # Derive Actual Relative Time from Next Dose (AXRLT not kept)
  derive_vars_duration(
    new_var = AXRLT,
    start_date = ADTM_next,
    end_date = ADTM,
    out_unit = "hours",
    floor_in = FALSE,
    add_one = FALSE
  ) %>%
  mutate(
    ARRLT = case_when(
      EVID == 1 ~ 0,
      is.na(ARRLT) ~ AXRLT,
      TRUE ~ ARRLT
    ),

    # Derive Reference Dose Date
    PCRFTDTM = case_when(
      EVID == 1 ~ ADTM,
      is.na(ADTM_prev) ~ ADTM_next,
      TRUE ~ ADTM_prev
    )
  ) %>%
  # Derive dates and times from datetimes
  derive_vars_dtm_to_dt(exprs(FANLDTM)) %>%
  derive_vars_dtm_to_tm(exprs(FANLDTM)) %>%
  derive_vars_dtm_to_dt(exprs(PCRFTDTM)) %>%
  derive_vars_dtm_to_tm(exprs(PCRFTDTM))

Derive Relative Time Output

# A tibble: 17 × 7
   USUBJID     FANLDT     AVISIT PCTPT              AFRLT   ARRLT AXRLT
   <chr>       <date>     <chr>  <chr>              <dbl>   <dbl> <dbl>
 1 01-701-1028 2013-07-19 Day 1  Pre-dose         -0.5    -0.5     -0.5
 2 01-701-1028 2013-07-19 Day 1  <NA>              0       0       NA  
 3 01-701-1028 2013-07-19 Day 1  5 Min Post-dose   0.0833  0.0833 -23.9
 4 01-701-1028 2013-07-19 Day 1  30 Min Post-dose  0.5     0.5    -23.5
 5 01-701-1028 2013-07-19 Day 1  1h Post-dose      1       1      -23  
 6 01-701-1028 2013-07-19 Day 1  1.5h Post-dose    1.5     1.5    -22.5
 7 01-701-1028 2013-07-19 Day 1  2h Post-dose      2       2      -22  
 8 01-701-1028 2013-07-19 Day 1  4h Post-dose      4       4      -20  
 9 01-701-1028 2013-07-19 Day 1  6h Post-dose      6       6      -18  
10 01-701-1028 2013-07-19 Day 1  8h Post-dose      8       8      -16  
11 01-701-1028 2013-07-19 Day 1  12h Post-dose    12      12      -12  
12 01-701-1028 2013-07-19 Day 1  16h Post-dose    16      16       -8  
13 01-701-1028 2013-07-19 Day 2  24h Post-dose    24      24        0  
14 01-701-1028 2013-07-19 Day 2  <NA>             24       0       NA  
15 01-701-1028 2013-07-19 Day 2  36h Post-dose    36      12      -12  
16 01-701-1028 2013-07-19 Day 3  48h Post-dose    48      24        0  
17 01-701-1028 2013-07-19 Day 3  <NA>             48       0       NA  

AFRLT = Actual Relative Time from Analyte First Dose ARRLT = Actual Relative Time from Reference Dose

Find Nominal Relative Times

adpc <- adpc %>%
  # Derive Nominal Relative Time from Reference Dose (NRRLT)
  mutate(
    NRRLT = case_when(
      EVID == 1 ~ 0,
      is.na(NFRLT_prev) ~ NFRLT - min_NFRLT,
      TRUE ~ NFRLT - NFRLT_prev
    ),
    NXRLT = case_when(
      EVID == 1 ~ 0,
      TRUE ~ NFRLT - NFRLT_next
    )
  )

Nominal Relative Times Output

# A tibble: 17 × 6
   USUBJID     AVISIT PCTPT            NFRLT NRRLT NXRLT
   <chr>       <chr>  <chr>            <dbl> <dbl> <dbl>
 1 01-701-1028 Day 1  Pre-dose          0     0      0  
 2 01-701-1028 Day 1  <NA>              0     0      0  
 3 01-701-1028 Day 1  5 Min Post-dose   0.08  0.08 -23.9
 4 01-701-1028 Day 1  30 Min Post-dose  0.5   0.5  -23.5
 5 01-701-1028 Day 1  1h Post-dose      1     1    -23  
 6 01-701-1028 Day 1  1.5h Post-dose    1.5   1.5  -22.5
 7 01-701-1028 Day 1  2h Post-dose      2     2    -22  
 8 01-701-1028 Day 1  4h Post-dose      4     4    -20  
 9 01-701-1028 Day 1  6h Post-dose      6     6    -18  
10 01-701-1028 Day 1  8h Post-dose      8     8    -16  
11 01-701-1028 Day 1  12h Post-dose    12    12    -12  
12 01-701-1028 Day 1  16h Post-dose    16    16     -8  
13 01-701-1028 Day 2  24h Post-dose    24    24      0  
14 01-701-1028 Day 2  <NA>             24     0      0  
15 01-701-1028 Day 2  36h Post-dose    36    12    -12  
16 01-701-1028 Day 3  48h Post-dose    48    24      0  
17 01-701-1028 Day 3  <NA>             48     0      0  

NFRLT = Nominal Relative Time from Analyte First Dose NRRLT = Nominal Relative Time from Reference Dose

Derive Analysis Variables

adpc <- adpc %>%
  mutate(
    ATPTN = case_when(
      EVID == 1 ~ 0,
      TRUE ~ PCTPTNUM
    ),
    ATPT = case_when(
      EVID == 1 ~ "Dose",
      TRUE ~ PCTPT
    ),
    ATPTREF = case_when(
      EVID == 1 ~ AVISIT,
      is.na(AVISIT_prev) ~ AVISIT_next,
      TRUE ~ AVISIT_prev
    ),
    # Derive baseline flag for pre-dose records
    ABLFL = case_when(
      ATPT == "Pre-dose" ~ "Y",
      TRUE ~ NA_character_
    ),
    # Derive BASETYPE
    BASETYPE = paste(ATPTREF, "Baseline"),

    # Derive Actual Dose
    DOSEA = case_when(
      EVID == 1 ~ EXDOSE,
      is.na(EXDOSE_prev) ~ EXDOSE_next,
      TRUE ~ EXDOSE_next
    ),
    # Derive Planned Dose
    DOSEP = case_when(
      TRT01P == "Xanomeline High Dose" ~ 81,
      TRT01P == "Xanomeline Low Dose" ~ 54
    ),
    DOSEU = "mg",
  ) %>%
  mutate(
    FRLTU = "h",
    RRLTU = "h",
    PARAMCD = coalesce(PCTESTCD, "DOSE"),
    ALLOQ = PCLLOQ,
    AVAL = case_when(
      EVID == 1 ~ EXDOSE,
      PCSTRESC == "<BLQ" & NFRLT == 0 ~ 0,
      PCSTRESC == "<BLQ" & NFRLT > 0 ~ 0.5 * ALLOQ,
      TRUE ~ PCSTRESN
    ),
    AVALU = case_when(
      EVID == 1 ~ EXDOSU,
      TRUE ~ PCSTRESU
    ),
    AVALCAT1 = if_else(PCSTRESC == "<BLQ", PCSTRESC, prettyNum(signif(AVAL, digits = 3))),
  ) %>%
  # Add SRCSEQ
  mutate(
    SRCDOM = DOMAIN,
    SRCVAR = "SEQ",
    SRCSEQ = coalesce(PCSEQ, EXSEQ)
  )

Analysis Variable Output

# A tibble: 17 × 8
   USUBJID     NFRLT AVISIT ATPT             ABLFL ATPTREF    AVAL AVALCAT1
   <chr>       <dbl> <chr>  <chr>            <chr> <chr>     <dbl> <chr>   
 1 01-701-1028  0    Day 1  Pre-dose         Y     Day 1    0      <BLQ    
 2 01-701-1028  0    Day 1  Dose             <NA>  Day 1   54      <NA>    
 3 01-701-1028  0.08 Day 1  5 Min Post-dose  <NA>  Day 1    0.0957 0.0957  
 4 01-701-1028  0.5  Day 1  30 Min Post-dose <NA>  Day 1    0.522  0.522   
 5 01-701-1028  1    Day 1  1h Post-dose     <NA>  Day 1    0.895  0.895   
 6 01-701-1028  1.5  Day 1  1.5h Post-dose   <NA>  Day 1    1.16   1.16    
 7 01-701-1028  2    Day 1  2h Post-dose     <NA>  Day 1    1.35   1.35    
 8 01-701-1028  4    Day 1  4h Post-dose     <NA>  Day 1    1.71   1.71    
 9 01-701-1028  6    Day 1  6h Post-dose     <NA>  Day 1    1.80   1.8     
10 01-701-1028  8    Day 1  8h Post-dose     <NA>  Day 1    1.82   1.82    
11 01-701-1028 12    Day 1  12h Post-dose    <NA>  Day 1    0.571  0.571   
12 01-701-1028 16    Day 1  16h Post-dose    <NA>  Day 1    0.178  0.178   
13 01-701-1028 24    Day 2  24h Post-dose    <NA>  Day 1    0.0173 0.0173  
14 01-701-1028 24    Day 2  Dose             <NA>  Day 2   54      <NA>    
15 01-701-1028 36    Day 2  36h Post-dose    <NA>  Day 2    0.005  <BLQ    
16 01-701-1028 48    Day 3  48h Post-dose    <NA>  Day 2    0.005  <BLQ    
17 01-701-1028 48    Day 3  Dose             <NA>  Day 3   54      <NA>    

ATPT Analysis Timepoint ATPTREF Analysis Timepoint Reference AVAL Analysis Value

Create Duplicated Records for Analysis

  • Use One Record in More than One Way
  • Record may be both “24 Hour Post-Dose” and “Pre-Dose”
  • Create DTYPE = “COPY” Records
  • Original PCSEQ is retained
  • Change “24h Post-dose” to “Pre-dose”
  • ABLFL is set to “Y”

Duplicated Records for Analysis Code

# ---- Create DTYPE copy records ----

dtype <- adpc %>%
  filter(NFRLT > 0 & NXRLT == 0 & EVID == 0 & !is.na(AVISIT_next)) %>%
  select(-PCRFTDT, -PCRFTTM) %>%
  # Re-derive variables in for DTYPE copy records
  mutate(
    ABLFL = NA_character_,
    ATPTREF = AVISIT_next,
    ARRLT = AXRLT,
    NRRLT = NXRLT,
    PCRFTDTM = ADTM_next,
    DOSEA = EXDOSE_next,
    BASETYPE = paste(AVISIT_next, "Baseline"),
    ATPT = "Pre-dose",
    ATPTN = NFRLT,
    ABLFL = "Y",
    DTYPE = "COPY"
  ) %>%
  derive_vars_dtm_to_dt(exprs(PCRFTDTM)) %>%
  derive_vars_dtm_to_tm(exprs(PCRFTDTM))

Duplicated Records for Analysis Output

# A tibble: 2 × 8
  USUBJID     DTYPE BASETYPE       ATPT     NFRLT NRRLT AFRLT ARRLT
  <chr>       <chr> <chr>          <chr>    <dbl> <dbl> <dbl> <dbl>
1 01-701-1028 COPY  Day 2 Baseline Pre-dose    24     0    24     0
2 01-701-1028 COPY  Day 3 Baseline Pre-dose    48     0    48     0

Note that NRRLT and ARRLT equal zero for next dose

Combine ADPC data with Duplicated Records

# ---- Combine original records and DTYPE copy records ----

adpc <- bind_rows(adpc, dtype) %>%
  arrange(STUDYID, USUBJID, BASETYPE, ADTM, NFRLT) %>%
  mutate(
    # Derive MRRLT, ANL01FL and ANL02FL
    MRRLT = if_else(ARRLT < 0, 0, ARRLT),
    ANL01FL = "Y",
    ANL02FL = if_else(is.na(DTYPE), "Y", NA_character_),
  )

Combine ADPC Output

# A tibble: 19 × 5
   USUBJID     BASETYPE       ATPT             DTYPE   ARRLT
   <chr>       <chr>          <chr>            <chr>   <dbl>
 1 01-701-1028 Day 1 Baseline Pre-dose         <NA>  -0.5   
 2 01-701-1028 Day 1 Baseline Dose             <NA>   0     
 3 01-701-1028 Day 1 Baseline 5 Min Post-dose  <NA>   0.0833
 4 01-701-1028 Day 1 Baseline 30 Min Post-dose <NA>   0.5   
 5 01-701-1028 Day 1 Baseline 1h Post-dose     <NA>   1     
 6 01-701-1028 Day 1 Baseline 1.5h Post-dose   <NA>   1.5   
 7 01-701-1028 Day 1 Baseline 2h Post-dose     <NA>   2     
 8 01-701-1028 Day 1 Baseline 4h Post-dose     <NA>   4     
 9 01-701-1028 Day 1 Baseline 6h Post-dose     <NA>   6     
10 01-701-1028 Day 1 Baseline 8h Post-dose     <NA>   8     
11 01-701-1028 Day 1 Baseline 12h Post-dose    <NA>  12     
12 01-701-1028 Day 1 Baseline 16h Post-dose    <NA>  16     
13 01-701-1028 Day 1 Baseline 24h Post-dose    <NA>  24     
14 01-701-1028 Day 2 Baseline Dose             <NA>   0     
15 01-701-1028 Day 2 Baseline Pre-dose         COPY   0     
16 01-701-1028 Day 2 Baseline 36h Post-dose    <NA>  12     
17 01-701-1028 Day 2 Baseline 48h Post-dose    <NA>  24     
18 01-701-1028 Day 3 Baseline Dose             <NA>   0     
19 01-701-1028 Day 3 Baseline Pre-dose         COPY   0     

Calculate Baseline and Change from Baseline

# ---- Calculate BASE and Change from Baseline ----

adpc <- adpc %>%
  # Derive BASE
  derive_var_base(
    by_vars = exprs(STUDYID, USUBJID, PARAMCD, BASETYPE),
    source_var = AVAL,
    new_var = BASE,
    filter = ABLFL == "Y"
  )

adpc <- derive_var_chg(adpc)

Use functions derive_var_base() and derive_var_chg()

Baseline and Change Output

# A tibble: 19 × 10
   USUBJID     BASETYPE DTYPE AVISIT ATPT     AVAL NRRLT   ARRLT    BASE     CHG
   <chr>       <chr>    <chr> <chr>  <chr>   <dbl> <dbl>   <dbl>   <dbl>   <dbl>
 1 01-701-1028 Day 1 B… <NA>  Day 1  Pre-…  0       0    -0.5     0       0     
 2 01-701-1028 Day 1 B… <NA>  Day 1  Dose  54       0     0      NA      NA     
 3 01-701-1028 Day 1 B… <NA>  Day 1  5 Mi…  0.0957  0.08  0.0833  0       0.0957
 4 01-701-1028 Day 1 B… <NA>  Day 1  30 M…  0.522   0.5   0.5     0       0.522 
 5 01-701-1028 Day 1 B… <NA>  Day 1  1h P…  0.895   1     1       0       0.895 
 6 01-701-1028 Day 1 B… <NA>  Day 1  1.5h…  1.16    1.5   1.5     0       1.16  
 7 01-701-1028 Day 1 B… <NA>  Day 1  2h P…  1.35    2     2       0       1.35  
 8 01-701-1028 Day 1 B… <NA>  Day 1  4h P…  1.71    4     4       0       1.71  
 9 01-701-1028 Day 1 B… <NA>  Day 1  6h P…  1.80    6     6       0       1.80  
10 01-701-1028 Day 1 B… <NA>  Day 1  8h P…  1.82    8     8       0       1.82  
11 01-701-1028 Day 1 B… <NA>  Day 1  12h …  0.571  12    12       0       0.571 
12 01-701-1028 Day 1 B… <NA>  Day 1  16h …  0.178  16    16       0       0.178 
13 01-701-1028 Day 1 B… <NA>  Day 2  24h …  0.0173 24    24       0       0.0173
14 01-701-1028 Day 2 B… <NA>  Day 2  Dose  54       0     0      NA      NA     
15 01-701-1028 Day 2 B… COPY  Day 2  Pre-…  0.0173  0     0       0.0173  0     
16 01-701-1028 Day 2 B… <NA>  Day 2  36h …  0.005  12    12       0.0173 -0.0123
17 01-701-1028 Day 2 B… <NA>  Day 3  48h …  0.005  24    24       0.0173 -0.0123
18 01-701-1028 Day 3 B… <NA>  Day 3  Dose  54       0     0      NA      NA     
19 01-701-1028 Day 3 B… COPY  Day 3  Pre-…  0.005   0     0       0.005   0     

Add ASEQ

# ---- Add ASEQ ----

adpc <- adpc %>%
  # Calculate ASEQ
  derive_var_obs_number(
    new_var = ASEQ,
    by_vars = exprs(STUDYID, USUBJID),
    order = exprs(ADTM, BASETYPE, EVID, AVISITN, ATPTN, DTYPE),
    check_type = "error"
  ) %>%
  # Remove temporary variables
  select(
    -DOMAIN, -PCSEQ, -starts_with("orig"), -starts_with("min"),
    -starts_with("max"), -starts_with("EX"), -ends_with("next"),
    -ends_with("prev"), -DRUG, -EVID, -AXRLT, -NXRLT, -VISITDY
  ) %>%
  # Derive PARAM and PARAMN
  derive_vars_merged(dataset_add = select(param_lookup, -PCTESTCD), by_vars = exprs(PARAMCD))

Use function derive_var_obs_number()

ASEQ Ouput

# A tibble: 19 × 11
   USUBJID  BASET…¹ DTYPE AVISIT ATPT     AVAL NFRLT NRRLT   AFRLT   ARRLT  ASEQ
   <chr>    <chr>   <chr> <chr>  <chr>   <dbl> <dbl> <dbl>   <dbl>   <dbl> <int>
 1 01-701-… Day 1 … <NA>  Day 1  Pre-…  0       0     0    -0.5    -0.5        1
 2 01-701-… Day 1 … <NA>  Day 1  Dose  54       0     0     0       0          2
 3 01-701-… Day 1 … <NA>  Day 1  5 Mi…  0.0957  0.08  0.08  0.0833  0.0833     3
 4 01-701-… Day 1 … <NA>  Day 1  30 M…  0.522   0.5   0.5   0.5     0.5        4
 5 01-701-… Day 1 … <NA>  Day 1  1h P…  0.895   1     1     1       1          5
 6 01-701-… Day 1 … <NA>  Day 1  1.5h…  1.16    1.5   1.5   1.5     1.5        6
 7 01-701-… Day 1 … <NA>  Day 1  2h P…  1.35    2     2     2       2          7
 8 01-701-… Day 1 … <NA>  Day 1  4h P…  1.71    4     4     4       4          8
 9 01-701-… Day 1 … <NA>  Day 1  6h P…  1.80    6     6     6       6          9
10 01-701-… Day 1 … <NA>  Day 1  8h P…  1.82    8     8     8       8         10
11 01-701-… Day 1 … <NA>  Day 1  12h …  0.571  12    12    12      12         11
12 01-701-… Day 1 … <NA>  Day 1  16h …  0.178  16    16    16      16         12
13 01-701-… Day 1 … <NA>  Day 2  24h …  0.0173 24    24    24      24         13
14 01-701-… Day 2 … COPY  Day 2  Pre-…  0.0173 24     0    24       0         14
15 01-701-… Day 2 … <NA>  Day 2  Dose  54      24     0    24       0         15
16 01-701-… Day 2 … <NA>  Day 2  36h …  0.005  36    12    36      12         16
17 01-701-… Day 2 … <NA>  Day 3  48h …  0.005  48    24    48      24         17
18 01-701-… Day 3 … COPY  Day 3  Pre-…  0.005  48     0    48       0         18
19 01-701-… Day 3 … <NA>  Day 3  Dose  54      48     0    48       0         19
# … with abbreviated variable name ¹​BASETYPE

Add Additional Baseline Variables

  • Derive additional baseline values from VS
  • Baseline height HTBL and weight WTBL
  • Compute body mass index (BMI) with compute_bmi()

Additional Baseline Variables Code

# Derive additional baselines from VS
adpc <- adpc %>%
  derive_vars_merged(
    dataset_add = vs,
    filter_add = VSTESTCD == "HEIGHT",
    by_vars = exprs(STUDYID, USUBJID),
    new_vars = exprs(HTBL = VSSTRESN, HTBLU = VSSTRESU)
  ) %>%
  derive_vars_merged(
    dataset_add = vs,
    filter_add = VSTESTCD == "WEIGHT" & VSBLFL == "Y",
    by_vars = exprs(STUDYID, USUBJID),
    new_vars = exprs(WTBL = VSSTRESN, WTBLU = VSSTRESU)
  ) %>%
  mutate(
    BMIBL = compute_bmi(height = HTBL, weight = WTBL),
    BMIBLU = "kg/m^2"
  )

Use derive_vars_merged() function

Additional Baseline Output

# A tibble: 19 × 10
   USUBJID      HTBL HTBLU  WTBL WTBLU BMIBL BMIBLU BASETYPE       ATPT     AVAL
   <chr>       <dbl> <chr> <dbl> <chr> <dbl> <chr>  <chr>          <chr>   <dbl>
 1 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline Pre-…  0     
 2 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline Dose  54     
 3 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 5 Mi…  0.0957
 4 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 30 M…  0.522 
 5 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 1h P…  0.895 
 6 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 1.5h…  1.16  
 7 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 2h P…  1.35  
 8 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 4h P…  1.71  
 9 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 6h P…  1.80  
10 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 8h P…  1.82  
11 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 12h …  0.571 
12 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 16h …  0.178 
13 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 1 Baseline 24h …  0.0173
14 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 2 Baseline Pre-…  0.0173
15 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 2 Baseline Dose  54     
16 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 2 Baseline 36h …  0.005 
17 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 2 Baseline 48h …  0.005 
18 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 3 Baseline Pre-…  0.005 
19 01-701-1028  178. cm     99.3 kg     31.4 kg/m^2 Day 3 Baseline Dose  54     

Add the ADSL variables

# Add all ADSL variables
adpc <- adpc %>%
  derive_vars_merged(
    dataset_add = select(adsl, !!!negate_vars(adsl_vars)),
    by_vars = exprs(STUDYID, USUBJID)
  )

Use derive_vars_merged() function

Add Labels and Attributes

Example Script

  • ADPC ad_adpc.R

  • Call use_ad_template("adpc")

Conclusions

  • {admiral} Functionality is Suitable for PK Data Programming
  • Minimal Updates to Existing Functions Required
  • Additional Functions Could be Added if Needed
  • Programming Flow is Consistent with other ADaMs
  • Extensible to Other PK Programming such as ADPPK

Thank You

  • {admiral} Team
  • Roche and Genentech Colleagues
  • Navitas Data Sciences Colleagues

Questions and Answers

Contact